package com.general.framework.zzyy.thread02;

import java.util.concurrent.*;

/**
 * @Author：xiaoqi
 * @creat 2023/8/5 17:14
 * 四个静态方法的演示
 *
 * get()方法会阻塞等待，直到任务完成
 * join()方法会阻塞等待，直到任务完成
 * 两个方法的区别在于get()方法会抛出异常，而join()方法不会
 */
public class CompletableFutureDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建一个线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(10);

        // 1. 使用 runAsync 创建 completableFuture（没有返回值）
        CompletableFuture completableFuture = CompletableFuture.runAsync(() -> {
            System.out.println(Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, threadPool);
        System.out.println(completableFuture.get());

        // 2. 使用 supplyAsync 创建 completableFuture（有返回值）
        CompletableFuture supplyCompletableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "hello supplyAsync";
        }, threadPool);

        System.out.println(supplyCompletableFuture.get());
        threadPool.shutdown();
    }
}